﻿/*----------------------------------------------------------------
    // Copyright (C) 2009 江苏华招网
    // 版权所有。 
    // 作者：李刚 
    //
    // 文件名：HzButton.cs
    // 文件功能描述：带权限的Button
    // 创建标识：李刚 2009-03-19
    //
    // 修改标识：
    // 修改描述：
    //
    // 修改标识：
    // 修改描述：
    //
    // 审核人：
    // 审核时间：
    // 审核说明：
 //----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace HZ.WinForm
{
    /// <summary>
    /// 控件接口，带权限控件所需实现的接口。
    /// </summary>
    public interface IRbacControl
    {
        //事件
        event EventHandler Validate;

        //属性
        bool ActionCancel { get; set; }
        bool EnableRBAC { get; set; }
        string ModuleNo { get; set; }
        string OperateType { get; set; }
        string AttributeToControl { get; set; }
    }

    /// <summary>
    /// 带权限的Button。
    /// </summary>
    public partial class HzButton : System.Windows.Forms.Button, IRbacControl
    {
        //成员
        private string _ModuleNo = string.Empty;
        private string _OperateType = string.Empty;
        private string _AttributeToControl = string.Empty;
        private bool _EnableRBAC = true;
        private bool _ActionCancel = false;
        private static readonly object EventValidate;

        // 事件
        [Browsable(false)]
        public event EventHandler Validate
        {
            add
            {
                base.Events.AddHandler(EventValidate, value);
            }
            remove
            {
                base.Events.RemoveHandler(EventValidate, value);
            }
        }

        static HzButton()
        {
            EventValidate = new object();
        }

        public HzButton()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 调用控件权限验证
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnValidate(EventArgs e)
        {
            EventHandler handler = (EventHandler)base.Events[EventValidate];
            if (handler != null)
            {
                handler(this, e);
            }
        }

        /// <summary>
        /// 重载Onclick
        /// </summary>
        /// <param name="e"></param>
        protected override void OnClick(EventArgs e)
        {
            //在OnClick事件前现验证权限
            OnValidate(EventArgs.Empty);

            //动作未被取消则继续执行click
            if (this._ActionCancel == false)
            {
                base.OnClick(e);
            }
        }

        #region IRbacControl 成员


        [Category("权限"), Description("是否启用权限控制"), DefaultValue(true)]
        public bool EnableRBAC
        {
            get { return this._EnableRBAC; }
            set { this._EnableRBAC = value; }
        }

        [DefaultValue(""), Category("权限"), Description("权限模块编号")]
        public string ModuleNo
        {
            get { return this._ModuleNo; }
            set { this._ModuleNo = value; }
        }

        [DefaultValue(""), Category("权限"), Description("权限操作类型")]
        public string OperateType
        {
            get { return this._OperateType; }
            set { this._OperateType = value; }
        }
        [DefaultValue("Enabled"), Category("权限"), Description("权限控制的属性")]
        public string AttributeToControl
        {
            get { return this._AttributeToControl; }
            set { this._AttributeToControl = value; }
        }
        [Browsable(false), DefaultValue(false), Category("权限"), Description("是否取消控件动作")]
        public bool ActionCancel
        {
            get
            {
                return this._ActionCancel;
            }
            set
            {
                this._ActionCancel = value;
            }
        }
        #endregion
    }

    partial class HzButton
    {
        /// <summary> 
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源，为 true；否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 组件设计器生成的代码

        /// <summary> 
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }

        #endregion
    }
}